/**
 * The MIT License (MIT)
 * 
 * Copyright (c) 2016 mo_yq5 (mo_yq5@163.com)
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 */
package com.openapi.alipay.trade.pay;

import java.util.List;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.openapi.alipay.trade.ExtendParams;
import com.openapi.alipay.trade.GoodsDetail;
import com.openapi.alipay.trade.RoyaltyInfo;
import com.openapi.alipay.trade.SubMerchant;

/**
 * 统一收单交易支付接口－请求参数
 * @author Moyq5
 * @since 2016年7月25日
 */
public class AlipayTradePayBizContent {

	/**
	 * 商户订单号,64个字符以内、可包含字母、数字、下划线；需保证在商户端不重复<br>
	 * 必填，最长64，如：20150320010101001
	 */
	@JsonProperty("out_trade_no")
	private String outTradeNo;
	
	/**
	 * 支付场景 条码支付，取值：bar_code 声波支付，取值：wave_code<br>
	 * 必填，最长32，如：bar_code,wave_code
	 */
	private String scene;
	
	/**
	 * 支付授权码<br>
	 * 必填，最长32，如：28763443825664394
	 */
	@JsonProperty("auth_code")
	private String authCode;
	
	/**
	 * 如果该值为空，则默认为商户签约账号对应的支付宝用户ID<br>
	 * 最长28，如：2088102146225135
	 */
	@JsonProperty("seller_id")
	private String sellerId;
	
	/**
	 * 订单总金额，单位为元，精确到小数点后两位，取值范围[0.01,100000000]。 <br>
	 * 如果同时传入【可打折金额】和【不可打折金额】，该参数可以不用传入； <br>
	 * 如果同时传入了【可打折金额】，【不可打折金额】，【订单总金额】三者，<br>
	 * 则必须满足如下条件：【订单总金额】=【可打折金额】+【不可打折金额】<br>
	 * 最长11，如：88.88
	 */
	@JsonProperty("total_amount")
	private Float totalAmount;
	
	/**
	 * 参与优惠计算的金额，单位为元，精确到小数点后两位，取值范围[0.01,100000000]。 <br>
	 * 如果该值未传入，但传入了【订单总金额】和【不可打折金额】，则该值默认为【订单总金额】-【不可打折金额】<br>
	 * 最长11，如：8.88
	 */
	@JsonProperty("discountable_amount")
	private Float discountableAmount;
	
	/**
	 * 不参与优惠计算的金额，单位为元，精确到小数点后两位，取值范围[0.01,100000000]。<br>
	 * 如果该值未传入，但传入了【订单总金额】和【可打折金额】，则该值默认为【订单总金额】-【可打折金额】<br>
	 * 最长11，如：80.00
	 */
	@JsonProperty("undiscountable_amount")
	private Float undiscountableAmount;
	
	/**
	 * 订单标题<br>
	 * 必填，最长256，如：Iphone6 16G
	 */
	private String subject;
	
	/**
	 * 订单描述<br>
	 * 最长128，如：Iphone6 16G
	 */
	private String body;
	
	/**
	 * 订单包含的商品列表信息，Json格式，其它说明详见商品明细说明
	 */
	@JsonProperty("goods_detail")
	private List<GoodsDetail> goodsDetail;
	
	/**
	 * 商户操作员编号<br>
	 * 最长28，如：yx_001
	 */
	@JsonProperty("operator_id")
	private String operatorId;
	
	/**
	 * 商户门店编号<br>
	 * 最长32，如：NJ_001
	 */
	@JsonProperty("store_id")
	private String storeId;
	
	/**
	 * 商户机具终端编号<br>
	 * 最长32，如：NJ_T_001
	 */
	@JsonProperty("terminal_id")
	private String terminalId;
	
	/**
	 * 支付宝的店铺编号<br>
	 * 最长32，如：2016041400077000000003314986
	 */
	@JsonProperty("alipay_store_id")
	private String alipayStoreId;
	
	/**
	 * 业务扩展参数
	 */
	@JsonProperty("extend_params")
	private ExtendParams extendParams;
	
	/**
	 * 该笔订单允许的最晚付款时间，逾期将关闭交易。<br>
	 * 取值范围：1m～15d。m-分钟，h-小时，d-天，1c-当天（1c-当天的情况下，无论交易何时创建，都在0点关闭）。<br>
	 * 该参数数值不接受小数点， 如 1.5h，可转换为 90m<br>
	 * 最长6，如：90
	 */
	@JsonProperty("timeout_express")
	private String timeoutExpress;
	
	/**
	 * 描述分账信息
	 */
	@JsonProperty("royalty_info")
	private RoyaltyInfo royaltyInfo;
	
	/**
	 * 二级商户信息,当前只对特殊银行机构特定场景下使用此字段
	 */
	@JsonProperty("sub_merchant")
	private SubMerchant subMerchant;

	/**
	 * @return the outTradeNo
	 */
	public String getOutTradeNo() {
		return outTradeNo;
	}

	/**
	 * @param outTradeNo the outTradeNo to set
	 */
	public void setOutTradeNo(String outTradeNo) {
		this.outTradeNo = outTradeNo;
	}

	/**
	 * @return the scene
	 */
	public String getScene() {
		return scene;
	}

	/**
	 * @param scene the scene to set
	 */
	public void setScene(String scene) {
		this.scene = scene;
	}

	/**
	 * @return the authCode
	 */
	public String getAuthCode() {
		return authCode;
	}

	/**
	 * @param authCode the authCode to set
	 */
	public void setAuthCode(String authCode) {
		this.authCode = authCode;
	}

	/**
	 * @return the sellerId
	 */
	public String getSellerId() {
		return sellerId;
	}

	/**
	 * @param sellerId the sellerId to set
	 */
	public void setSellerId(String sellerId) {
		this.sellerId = sellerId;
	}

	/**
	 * @return the totalAmount
	 */
	public Float getTotalAmount() {
		return totalAmount;
	}

	/**
	 * @param totalAmount the totalAmount to set
	 */
	public void setTotalAmount(Float totalAmount) {
		this.totalAmount = totalAmount;
	}

	/**
	 * @return the discountableAmount
	 */
	public Float getDiscountableAmount() {
		return discountableAmount;
	}

	/**
	 * @param discountableAmount the discountableAmount to set
	 */
	public void setDiscountableAmount(Float discountableAmount) {
		this.discountableAmount = discountableAmount;
	}

	/**
	 * @return the undiscountableAmount
	 */
	public Float getUndiscountableAmount() {
		return undiscountableAmount;
	}

	/**
	 * @param undiscountableAmount the undiscountableAmount to set
	 */
	public void setUndiscountableAmount(Float undiscountableAmount) {
		this.undiscountableAmount = undiscountableAmount;
	}

	/**
	 * @return the subject
	 */
	public String getSubject() {
		return subject;
	}

	/**
	 * @param subject the subject to set
	 */
	public void setSubject(String subject) {
		this.subject = subject;
	}

	/**
	 * @return the body
	 */
	public String getBody() {
		return body;
	}

	/**
	 * @param body the body to set
	 */
	public void setBody(String body) {
		this.body = body;
	}

	/**
	 * @return the goodsDetail
	 */
	public List<GoodsDetail> getGoodsDetail() {
		return goodsDetail;
	}

	/**
	 * @param goodsDetail the goodsDetail to set
	 */
	public void setGoodsDetail(List<GoodsDetail> goodsDetail) {
		this.goodsDetail = goodsDetail;
	}

	/**
	 * @return the operatorId
	 */
	public String getOperatorId() {
		return operatorId;
	}

	/**
	 * @param operatorId the operatorId to set
	 */
	public void setOperatorId(String operatorId) {
		this.operatorId = operatorId;
	}

	/**
	 * @return the storeId
	 */
	public String getStoreId() {
		return storeId;
	}

	/**
	 * @param storeId the storeId to set
	 */
	public void setStoreId(String storeId) {
		this.storeId = storeId;
	}

	/**
	 * @return the terminalId
	 */
	public String getTerminalId() {
		return terminalId;
	}

	/**
	 * @param terminalId the terminalId to set
	 */
	public void setTerminalId(String terminalId) {
		this.terminalId = terminalId;
	}

	/**
	 * @return the alipayStoreId
	 */
	public String getAlipayStoreId() {
		return alipayStoreId;
	}

	/**
	 * @param alipayStoreId the alipayStoreId to set
	 */
	public void setAlipayStoreId(String alipayStoreId) {
		this.alipayStoreId = alipayStoreId;
	}

	/**
	 * @return the extendParams
	 */
	public ExtendParams getExtendParams() {
		return extendParams;
	}

	/**
	 * @param extendParams the extendParams to set
	 */
	public void setExtendParams(ExtendParams extendParams) {
		this.extendParams = extendParams;
	}

	/**
	 * @return the timeoutExpress
	 */
	public String getTimeoutExpress() {
		return timeoutExpress;
	}

	/**
	 * @param timeoutExpress the timeoutExpress to set
	 */
	public void setTimeoutExpress(String timeoutExpress) {
		this.timeoutExpress = timeoutExpress;
	}

	/**
	 * @return the royaltyInfo
	 */
	public RoyaltyInfo getRoyaltyInfo() {
		return royaltyInfo;
	}

	/**
	 * @param royaltyInfo the royaltyInfo to set
	 */
	public void setRoyaltyInfo(RoyaltyInfo royaltyInfo) {
		this.royaltyInfo = royaltyInfo;
	}

	/**
	 * @return the subMerchant
	 */
	public SubMerchant getSubMerchant() {
		return subMerchant;
	}

	/**
	 * @param subMerchant the subMerchant to set
	 */
	public void setSubMerchant(SubMerchant subMerchant) {
		this.subMerchant = subMerchant;
	}
}
